package gold.gold01;

import java.util.Arrays;

/**
 * 很好奇java的矩阵操作, 有没有那种高效率的办法进行矩阵元素更改或者矩阵创建操作
 */
public class S0108零矩阵 {
    /**
     * 100, 25, 先找到要为0的行列, 再对matrix进行置0操作, 可以把rowZero写成 boolean[], 这样可能更好
     * 也可以在第一轮遍历的时候更改第一行第一列, 进行置0操作, 然后第二轮遍历的时候按照第一行和第一列来对其他行列进行置0
     * 这种情况实际上包括了第一行和第一列本身就为0的状况
     */
    public void setZeroes(int[][] matrix) {
        if(matrix == null || matrix.length == 0) return;
        // 遍历一遍matrix, 找到要置0的行和列
        int[] rowZero = new int[matrix.length];
        int[] colZero = new int[matrix[0].length];
        for(int i = 0; i < matrix.length; i++){
            for (int j = 0; j < matrix[0].length; j++) {
                if(matrix[i][j] == 0){
                    rowZero[i] = 1;
                    colZero[j] = 1;
                }
            }
        }
        for(int i = 0; i < matrix.length; i ++){
            if(rowZero[i] == 1){
                matrix[i] = new int[matrix[0].length];
            }
        }
        for(int i = 0; i < matrix[0].length; i ++){
            if(colZero[i] == 1){
                for(int j = 0; j < matrix.length; j++){
                    matrix[j][i] = 0;
                }
            }
        }
    }

    // 这里用了boolean, 同时, 使用||操作, 更加直观
    public void setZeroes2(int[][] matrix) {
        int lenx = matrix.length, leny = matrix[0].length;
        boolean[] row = new boolean[lenx], col = new boolean[leny];
        for (int i = 0; i < lenx; i++)
            for (int j = 0; j < leny; j++)
                if (matrix[i][j] == 0) {
                    row[i] = true;
                    col[j] = true;
                }
        // 这个赋值好，只要行/列是符合的，就置0
        for (int i = 0; i < lenx; i++)
            for (int j = 0; j < leny; j++)
                if (row[i] || col[j])
                    matrix[i][j] = 0;
    }
    public static void main(String[] args) {
        int[][] matrix = new int[][]{{1, 2, 3, 4, 5}, {6, 7, 8, 9, 0}, {11, 0, 13, 14, 15}, {16, 17, 18, 19, 20}};
        new S0108零矩阵().setZeroes(matrix);
        System.out.println(Arrays.deepToString(matrix));
    }
}
